In this third issue of WINDOID, we will continue to cover importing text into HyperCard. Gary Bond, one of Apples outstanding HyperCard test team members, wrote a universal import button that takes into consideration nearly everything. You can now create a button that imports MacWrite, Microsoft Word, many database files, and even HyperCard stacks! We think you are going to enjoy this. Phil Wyman, another excellent Apple HyperCard tester, has provided us with more of his highly acclaimed power-user tips and has taken a stab at explaining some of the more interesting aspects of HyperCard properties. In the two previous issues, there were some mistakes. I would like to apologize for any inconvenience or frustration they might have caused and rectify them. The errata will appear on page seven under WHOOPS. I generally get all the text stuffed into the WINDOID newsletter moments before the Thursday meeting, and
sometimes I miss something. Many of the excellent scripters that avidly read WINDOID have noticed my lapses and have provided me with needed repairs. For their kind assistance, I offer my thanks.
WINDOID provides an opportunity for its readers to contribute to the ongoing growth and excellence of HyperCard. With your assistance we can continue to bring to HyperCard added depth and functionality. In the back of every issue will be a form for you to keep by your Macintosh. This form will allow you the unique opportunity to participate directly in the continued development of HyperCard.
We will read all the forms returned and address questions that are being asked by HyperCard users. We will ask the team and provide you with an answer and publish the answers in this newsletter. In this way we can gather information and provide for your needs in future versions of HyperCard.
WINDOID is trying to make a difference in the way that you work with HyperCard. We need your input. What sort of stacks are you using, what kinds of stacks are you creating, and what are some of the joys and frustrations you are experiencing. We really want to know!
If you have a bug, suggestion, comment, or just want to know the best way to do something in HyperCard, you can fill out the form and send it to:
AHUG c/o David Leffler
Apple Computer, Inc.
MS/27-AQ
20525 Mariani Ave.
Cupertino, CA 95014
Or copy the format and Apple-Link it to: HYPERBUG$
EDITOR'S CHOICE
by David Leffler
At the last Apple HyperCard User Group meeting , Danny Goodman, author of The Complete HyperCard Handbook, presented to an appreciative audience his incredible business productivity stack Focal Point. It will be released soon by Activision. We were all amazed at the incredible graphics and awesome features he has scripted into it. Danny, as you might know, is not a programmer and has always been frustrated by his inability to turn his ideas into software. HyperCard has empowered him to not only turn his ideas into reality, but to allow him the opportunity to share his ideas with the world. Thank you Danny!
Amanda Goodenough, author of the Inigo and My Favorite Camel series of
wonderful adventures, was also on hand. Her obvious love of stories and great presentation style captivated the audience. Amanda continues to enhance and produce more of these non-textual stories and has graciously allowed us to place them in an Amandas Stacks folder on the AHUG StackWare server. My Favorite Camel is a favorite of mine, and I think everyone should see it and share it with someone they love.
There are two other stacks on the StackWare server that also deserve serious attention. The AIDS stack is a perfect representation of how HyperCard can be used in an incredibly invocative eye and heart grabbing style. This stack is not only visually and emotionally gripping, but is an excellent example of how to use HyperCard as a powerful vehicle to move you through diverse information. You should get this stack.
Finally, Tree Frog Studio software presents CheapSequencer. Tree Frog has given us a music sequencer that must be seen and heard to be believed. These innovative stackware developers are interested in entertaining us with great
graphics and functional stackware tools. Its stacks and people like these that really show the power and versatility of HyperCard.
POWERUSERS TIPS
by Phil Wyman
1. If you get tired of pulling the Tools Windoid off of the menubar when you need it, try Option-Tab, which will tear it off for you! Also, if the Tools Windoid is in a paint tool, hitting Tab will tear off the Patterns Windoid.
2. If you have a line in your script that is longer than the editor window,
you can place an Option-Return at a space in the line to break it into two
smaller lines. The two lines will execute in the same way as the original
line. (Do not place the Option-Return into the middle of a quoted string.
Also, if you use the Option-Return in a comment, remember that every line of a comment must start with a double hyphen!)
3. For those programmers out there who are used to for next loops, there is a next repeat command in HyperTalk which works in a repeat loop a lot like a next command in a for next loop. The next repeat command does not
execute anything that follows it in the repeat loop, but rather starts
executing at the beginning of the repeat loop. Also, if you wish to exit the repeat loop altogether, without executing anymore of the lines in the repeat loop, then use exit repeat.
Note:
If you want to exit the entire message handler from anywhere in the handler, use exit <handlername> (i.e., exit mouseup).
If you wish to leave the handler but wish the current message to be sent on up the hierarchical path from where it is now, then use pass <handlername>.
4. When concatenating two strings, you can add a space between the two strings by using two ampersands && instead of just one &.
5. A shorthand for button in HyperTalk is btn. A shorthand for background is bkgnd.
6. You can copy buttons, fields, backgrounds or cards between stacks. This is a very powerful feature of HyperCard.
7. For those of you with the regular size Mac Plus or Mac SE screens, try this for a thrill:
Set loc of cardWindow to 10,50
You will see what people on large screens see all the time, a window title bar which states the pathname of the window you are viewing. (To reset your cardWindow, Set loc of cardWindow to 0,0.)
8. If you are in any tool other than the Browse tool, you can return to the Browse tool by Command-Tab.
9. When you are in the Button tool, you can Command-Drag to create a new
button. Option-Drag on a button and you will drag a copy of the button.
10. A first attempt at a small treatise on the use of the,of, and () in HyperTalk:
In general, either the, of, or parentheses () are required to signal HyperTalk that a function or property is to be activated.
PROPERTIES:
With button, card, background, stack, and window properties, the is optional, but you need of. Also, properties never have parentheses. You can say:
put hilite of button 1
put the hilite of button 1
Since there is no of to activate it, you cannot say:
put the hilite button 1
If you are using a global or painting property, you need the, since there is
no of to activate the property. For instance, you can say:
put the lockScreen
put the textAlign
However, you cannot put the property by saying:
put lockScreen
because HyperCard will think you are using lockScreen as a variable, not a
property.
FUNCTIONS:
Either the, of, or parentheses () are required with a function.
However, you cannot mix the with parentheses in a system function. For
instance, you cannot say:
put the charToNum(a)
You are allowed to say:
put the chartonum of a
put chartonum(a)
put the chartonum of (a)
If a system function has more than one argument, it will always require
parentheses. For user-defined functions, you must always use parentheses, even if there are no argumentsi.e., userFunction(). If a function does not use of or (), then the is required! For example, date doesnt work without the, since there is not an of or () to activate the function. You can say:
put the date
But you cannot say:
put date
because HyperTalk will assume that date is a variable. This concept of
insisting on a the to activate the function allows for future expansion of
more system functions, since system functions will not be able to collide with variables that users already have in their scripts.
The UNIVERSAL IMPORT BUTTON
by Gary Bond
Rev. 2.2
Last issue we dealt with importing text. While those approaches are reliable,
they are also very slow and dont account for a number of problems that might
occur along the way. Consistent with our goal to provide you with the best,
this issue contains a script for a universal import button which does both
kinds of import (text and data). To use it, type it into any button script.
In addition to importing text files it also imports Macwrite and Word documents
and even Hypercard stacks! This version of the import button fixes bugs both in
Hypercard and in previous button versions.
on mouseUp
global cardcount,startcard,memory,header
get userlevel
put it into item 1 of memory
set userlevel to 5
set lockmessages to true
set lockscreen to true
put short id of this card into startcard
answer Import text file as: with Data or Text or Cancel
if it is Cancel then Cleanexit
if it is Text then
answer Include header information in fields? with Yes or No
put it into header
Importext
else
Importdata
end if
go next card
Cleanexit Compact
end mouseup
on importext
global cardcount,startcard,memory,header
put 0 into cardcount
repeat
ask Name or pathname of text file to import: with item 2 of memory
if short name of this stack is in it then
if , is not in memory then put , after memory
put it into item 2 of memory
answer Cant import current stack! with Ok
next repeat
end if
if it is empty then
Cleanexit
else
exit repeat
end if
end repeat
put it into filename
if , is not in memory then put , after memory
put it into item 2 of memory
set cursor to 4
open file filename
repeat
read from file filename for 16384
if it is empty and cardcount is 0 then
answer Could not find file: & filename with Ok
close file filename
Cleanexit
end if
if it is empty then exit repeat
put return after it
domenu New card
add 1 to cardcount
domenu New field
set name of card field (number of card fields) to Import
set style of card field Import to scrolling
drag from the loc of card field Import to 0,62
drag from 190,100 to 512,342
if header is Yes then
put Characters: && number of chars in it & return & return before it
put Lines: && number of lines in it & return before it
put File: && filename & return before it
put Import card: && cardcount & return before it
end if
put it into card field Import
end repeat
close file filename
if header is Yes then
repeat until the short id of this card is startcard
put of && cardcount after line 1 of card field Import
go previous card
end repeat
else
go card id startcard
end if
end importext
on importdata
global filename,cardcount,startcard,memory,header
put empty into delimiters
put empty into filename
put 0 into cardcount
put 0 into limit
put 0 into fieldcount
repeat until delimiters is not empty
put 0 into nofields
answer Use Tab and Return as delimiters? with Yes or Other or
Cancel
if it is Cancel then mouseup
if it is Yes then put 9,13 into delimiters
if it is Other then
repeat until ((item 1 of it > 0 and item 1 of it < 256)
and (item 2 of it > 0 and item 2 of it < 256)) or it is empty
ask Enter two comma separated Ascii delimiters: with empty
put it into delimiters
end repeat
end if
end repeat
if item 1 of delimiters is item 2 of delimiters then put 1 into nofields
answer Include header information in fields? with Yes or No
put it into header
repeat
ask Name or pathname of text file to import: with item 2 of memory
if short name of this stack is in it then
if , is not in memory then put , after memory
put it into item 2 of memory
answer Cant import current stack! with Ok
next repeat
end if
if it is empty then
if cardcount > 0 then
close file filename
CleanExit
end if
Importdata
else
exit repeat
end if
end repeat
put it into filename
if , is not in memory then put , after memory
put it into item 2 of memory
set cursor to 4
open file filename
repeat
read from file filename until (numtochar of item 2 of delimiters)
if it is empty and cardcount is 0 then
answer Could not find file: & filename with Ok
close file filename
Cleanexit
end if
if it is empty then exit repeat
if chartonum(last character of it) is not item 2 of delimiters then
put item 2 of delimiters into temp
if temp is 9 then put Tab into temp
if temp is 13 then put Return into temp
answer Cant find record delimiter: && temp with Ok
close file filename
cleanexit
end if
put empty into last character of it
if (numtochar of item 1 of delimiters) is not in it and nofields is 0 then
put item 1 of delimiters into temp
if temp is 9 then put Tab into temp
if temp is 13 then put Return into temp
answer Cant find field delimiter: && temp with Help or Ok
if it is help then
answer Use double record delimiters for records... with Continue
answer with no field delimiters. Example: 13,13 with Ok
end if
close file filename
Cleanexit
end if
if (numtochar of item 1 of delimiters) is not , and nofields is 0 then
repeat until (numtochar of item 1 of delimiters) is not in it
put , into character offset((numtochar of item 1 of delimiters),it) of it
end repeat
end if
if cardcount is 0 then
domenu New background
else
domenu New card
end if
add 1 to cardcount
if nofields is 0 then
put the number of items in it into limit
else
put nofields into limit
end if
repeat with count = 1 to limit
if cardcount is 1 then
add 1 to fieldcount
if fieldcount < 125 then
domenu New field
else
answer No more fields can be created! with Ok
Cleanexit Compact
end if
end if
put Field & count into fieldname
set name of bkgnd field (number of bkgnd fields) to fieldname
set style of bkgnd field fieldname to scrolling
If nofields is 0 and header is Yes then
put Field && count && of && the number of items in it & return into bkgnd┬ field fieldname
put Record && cardcount && of file: && filename & return & return after┬ bkgnd field fieldname
end if
if nofields is 0 then
put item count of it & return after bkgnd field fieldname
else
put it & return after bkgnd field fieldname
end if
end repeat
choose browse tool
end repeat
close file filename
go card id startcard
end importdata
on Cleanexit var
global memory
if param(1) is compact then
domenu Compact stack
end if
choose browse tool
set userlevel to item 1 of memory
set lockscreen to false
set lockmessages to false
exit to hypercard
end Cleanexit
We hope that this script will aid in your productivity with HyperCard. Please
let us know how you like it.
WHOOPS
by David Leffler
An errata from the first two issues of WINDOID.
ISSUE #1:
In the first issue Gary Bond showed us how to find out which line of a scrolling field the user has clicked on. Apple employee Brian McGhie found a small flaw and wrote me the following letter:
The question was asked, How can I find out which line of a field a user has
clicked in? The response was a method that would work in static fields, and
then further developed into a method for scrolling fields. The function
Clickline as given for scrolling windows only works if the scrolling field is
(in pixels) an integer multiple of the textheight. A corrected version of
Clickline appears below.
Function Clickline
return (trunc(((scroll of the target)
+ (item two of the clickloc)
- (item two of the rect of the target))
div the textheight of the target) + one)
End Clickline
The idea is to calculate the number of pixels from the top of the field to the
position that you clicked on. So you take the number of pixels that have
scrolled offscreen, and add in the vertical position of the mouseclick minus
the vertical position of the top of the field. This sum is the total number of
pixels from the logical top of the window not the visual top. Divide by the
height of the font to get the number of lines. Since this number is not always
an integer, truncate it. The result is a zero based count of lines. Add one and
return the correct line number that was clicked in.
ISSUE #2:
Robin Shank provided us with a How to Program FunctionKeys in HyperTalk
script. We left out a word, and the script will not work without it. The
script should read:
On functionkey whatkey
if whatkey is 6 then
type x with commandkey Cut whatever is selected
domenu background enter the background
type v with commandkey Paste it
domenu background leave the background
else
pass functionkey
end if
end functionkey
We hope you have enjoyed reading WINDOID and have found it to be interesting
and informative. We care enough to take the time to give you the most
up-to-date information about HyperCard, and we would like to make a request for
a little of your time. There is a form that follows this editorial; please fill
it out if you will. We are very interested in hearing from you. What sort of
stacks are you using, what kind of stacks are you creating, and what are your
joys and frustrations in using HyperCard.
You have the unique opportunity to communicate directly with Bill, Dan, and the
entire HyperCard development team. We really want to know what you would like
to see in HyperCard and are more than willing to give you what you want. What
we need to make this happen is your input. Let us know what you think. We can
address it in WINDOID or perhaps the next revision of HyperCard. You can make a
difference in the world by communicating with us. Dont pass up the
opportunity!
The form:
Please use the following form to make a difference in the world: